# 作者: 赵若云
# 2025年02月28日01时20分52秒
# 3478783573@qq.com

import re

# |匹配左右任意一个表达式
# (ab)将括号中字符作为一个分组
# \num引用分组num匹配到的字符串
# (?P<name>) 分组起别名
# (?P=name) 引用别名为name 分组匹配到的字符串

# 匹配0到100
# 添加|
ret = re.match(r"[1-9]?\d$|100", "100")
print(ret.group())
print('-' * 50)

# 匹配出163、126、qq邮箱,(ab)将括号中字符作为一个分组
email_list = ["xiaoWang@163.com", "xiaoWang@126.com", "xiaoWang@163.comheihei", "xiaowang@qq.com"]
for email in email_list:
    # 要加$，限定结尾，否则xiaoWang@163.comheihei也会匹配上
    ret = re.match(r'\w{5,20}@(163|126|qq)\.com$', email)  # 记得.要转义,不加的话xiaoWang@1636com会被匹配上
    if ret:
        print(f'{email}是合法的邮箱')
    else:
        print(f'{email}不是合法的邮箱')
print('-' * 50)

# 不是以4、7结尾的手机号码(11位)
tels = ["13100001234", "18912344321", "10086", "18800007777"]
for tel in tels:
    ret = re.match(r"1\d{9}[0-35-68-9]$", tel)
    if ret:
        print(ret.group())
    else:
        print("%s 不是想要的手机号" % tel)
print('-' * 50)

# 提取区号和电话号码
# ([^-]+) 代表没有遇到小横杠-就一直进行匹配，一直匹配下去
# ^-相当于对-取非，如果没遇见就一直匹配下去
ret = re.match(r"([^-]+)-(\d+)", "010-12345678")
# print(ret.group(0))  # 默认所有匹配到的都返回，010-12345678
print(ret.group(1))  # 一个（）代表一个分组
print(ret.group(2))
print('-' * 50)

# 学习引用标签
# 通过引用分组中匹配到的数据即可，但是要注意是元字符串，即类似 r""这种格式
# \1代表引用第一个分组，\2代表引用第二个分组，以此类推
ret = re.match(r"<([a-zA-Z]*)>\w*</\1>", "<html>hh</html>")
print(ret.group())

labels = ["<html><h1>www.cskaoyan.com</h1></html>", "<html><h1>www.cskaoyan.com </h2></html>"]
for label in labels:
    ret = re.match(r"<(\w*)><(\w*)>.*</\2></\1>", label)  # 用数字不便于后续修改，所以就要起名字，见下面的代码
    if ret:
        print("%s 是符合要求的标签" % ret.group())
    else:
        print("%s 不符合要求" % label)
# 起名字(?P<name>) (?P=name)
for label in labels:
    ret = re.match(r"<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>", label)  # 用数字不便于后续修改，所以就要起名字，见下面的代码
    if ret:
        print("%s 是符合要求的标签" % ret.group())
    else:
        print("%s 不符合要求" % label)
